/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.dp1.pucp.Ventas.Controlador;

import CharliesCookies.MainController;
import com.dp1.pucp.Modelo.Clases.Presentacion;
import com.dp1.pucp.Modelo.Clases.Documentoventa;
import com.dp1.pucp.Modelo.Clases.Kardex;
import com.dp1.pucp.Modelo.Clases.Lineapedidoproducto;
import com.dp1.pucp.Modelo.Clases.Pedidoproducto;
import com.dp1.pucp.Modelo.Clases.Productofinal;
import com.dp1.pucp.Modelo.Clases.Tipoproducto;
import com.dp1.pucp.Seguridad.DAO.LogDAO;
import com.dp1.pucp.Util.Validaciones;
import com.dp1.pucp.Ventas.DAO.DocVentaDAO;
import com.dp1.pucp.Ventas.VIsta.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Date;

/**
 *
 * @author Lucia
 */
public class MantDocVentaControlador {
    private DocVentaDAO dao;
    private MantDocVentaGUI2 mantDocVentaGUI;
    private ArrayList<String> listaEstado;
    private ArrayList<Documentoventa> documentos;
    
    
    public MantDocVentaControlador (DocVentaDAO dao, MantDocVentaGUI2 mantDocVentaGUI){
        this.dao = dao;
        this.mantDocVentaGUI = mantDocVentaGUI;
        
        this.mantDocVentaGUI.addNuevoListener(new nuevoDocVentaListener());
        this.mantDocVentaGUI.addBuscarListener(new buscarDocVentaListener());
        this.mantDocVentaGUI.addEditarListener(new editarDocVentaListener());
        this.mantDocVentaGUI.addEliminarListener(new eliminarDocVentaListener());
        this.mantDocVentaGUI.addLimpiarListener(new limpiarDocVentaListener());
      //  this.mantDocVentaGUI.addEntregarListener(new entregarListener());
        
        this.llenarComboEstado();
    }
    
    class nuevoDocVentaListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e){
            DocVentaGUI docVentaGUI = new DocVentaGUI(mantDocVentaGUI.getPadre(),true);
            DocVentaControlador c = new DocVentaControlador(dao, docVentaGUI, null);
            LogDAO.insertarLog(MainController.usuario, "Ingresar Agregar Documento de Venta");
            
            docVentaGUI.setVisible(true);
        }
        
    }
    
     class buscarDocVentaListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e){
            int estado = mantDocVentaGUI.getEstado();
            int codigo = mantDocVentaGUI.getCodigo();
            String cliente = mantDocVentaGUI.getCliente();
            cliente = cliente.toUpperCase();
            
            ArrayList<Documentoventa> auxiliar = dao.listarDocVentas(estado, codigo);
            documentos = new ArrayList<>();
            
            
            for (int i=0; i<auxiliar.size(); i++){
                if (auxiliar.get(i).getCliente().getRazonsocial().toUpperCase().contains(cliente))
                    documentos.add(auxiliar.get(i));
            }
           
            mantDocVentaGUI.llenaGrillaDocVentas(documentos);
        }
        
    }
     
      class editarDocVentaListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e){
             int indice = mantDocVentaGUI.getFilaSel();
            if (indice != -1) {
                DocVentaGUI docVentaGUI = new DocVentaGUI(mantDocVentaGUI.getPadre(), true);
                Documentoventa documento = documentos.get(indice);
                DocVentaControlador c = new DocVentaControlador(dao, docVentaGUI, documento);
                LogDAO.insertarLog(MainController.usuario, "Ingresar Editar Documento de Venta");
            
                docVentaGUI.setVisible(true);

            }
        }
        
    }
       class eliminarDocVentaListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e){
            int sel = mantDocVentaGUI.getFilaSel();
            if (sel!=1){
                Documentoventa d = documentos.get(sel);
                if (d.getEstado()==1){
                    d.setEstado(0);
                    dao.guardarDocVenta(d);
                    LogDAO.insertarLog(MainController.usuario, "Cancelar Documento de Venta");
            
                    Validaciones.mostrarMensajeAvisoVal("El documento de venta ha sido cancelado");
                }
                else{
                    Validaciones.mostrarMensajeErrorVal("No se puede cancelar el documento de venta");
                }
            }else{
                Validaciones.mostrarMensajeErrorVal("Debe selecccionar un documento de venta");
            }
                    
        }
        
    }
        class limpiarDocVentaListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e){
            
        }
        
    }
        
        class entregarListener implements  ActionListener{
            @Override
            public void actionPerformed(ActionEvent e){
                int sel = mantDocVentaGUI.getFilaSel();
                if (sel!=-1){
                    Documentoventa d = documentos.get(sel);
                    if (d.getEstado()==2){
                        disminuirstock(d);
                        d.setEstado(3);
                        dao.guardarDocVenta(d);
                        
                    }
                    else {
                        Validaciones.mostrarMensajeErrorVal("Esta venta aun no ha sido pagada por el cliente.");
                    }
                }
                else {
                    Validaciones.mostrarMensajeErrorVal("Debe seleccionar un documento de venta.");
                }
            }
                    
        }
    public void llenarComboEstado(){
        listaEstado = dao.listarEstadoDocVentas();
        mantDocVentaGUI.llenaComboEstado(listaEstado);
    }
    
    
    public void disminuirstock(Documentoventa d){
        float stockactual, stocksaliente, stockfinal = 0f;
        int galletasxPresentacion = 0;
        int cantidadPresentaciones = 0;
        Presentacion presentacion;
        
        Pedidoproducto p = dao.getPedidoProducto(d.getPedidoproducto().getIdpedidoproducto());
        ArrayList<Lineapedidoproducto> productos = dao.listarLineasPedidosProd(p);
        for (int i=0; i<productos.size(); i++){
            //disminuye stock del producto
            
            Productofinal prodFinal = dao.getProductoFinal(productos.get(i).getTipoproducto().getIdtipoproducto());
           
            
            stockactual = prodFinal.getCantidad();
            
            galletasxPresentacion = productos.get(i).getPresentacion().getCantidad();
            
            cantidadPresentaciones = (int)Math.round((productos.get(i).getCantidad()));
            
            stocksaliente = ((float)galletasxPresentacion)* ((float)cantidadPresentaciones);
            
            stockfinal = stockactual - stocksaliente;
            
            prodFinal.setCantidad(stockfinal);
            
            dao.guardarProductoFinal(prodFinal);
            
            // el kardex
            
             Tipoproducto tp= dao.getTipoProducto(productos.get(i).getTipoproducto().getIdtipoproducto());
             
            Kardex k = new Kardex();
            k.setFecha(new Date());
            k.setHora(new Date());
            k.setEstado(1); // 1 indica que se realizo el movimiento
            k.setTipo("PF"); // 1 indica que se realizo el movimiento
            k.setCantidad((long)stocksaliente);
            k.setEntradasalida('S');
            k.setTipoproducto(tp);
            k.setAlmacen(prodFinal.getAlmacen());
            k.setMotivo("Salida por venta a cliente");
            dao.guardarKardex(k);
            
        }
        p.setEstado(5); //finalizada y entregada
    }
}

